﻿Namespace Load

    ''' <summary>
    ''' 列エイリアスクラス
    ''' </summary>
    ''' <remarks>列属性を高速に検索できるようにするためのラッパークラス</remarks>
    Public Class ColumnAlias

#Region "Config"
        ''' <summary>
        ''' 列エイリアス名の書式
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>
        ''' {0}　テーブルエイリアス名
        ''' {1}　列エイリアスのインデックス番号
        ''' </remarks>
        Public Shared Property COLUMN_ALIAS_FORMAT As String = "{0}_{1}"
#End Region

        ''' <summary>
        ''' 所属しているテーブルエイリアス
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property TableAlias As TableAlias

        ''' <summary>
        ''' 列インデックス
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>テーブル内で一意の数字</remarks>
        Public Property Index As Integer

        ''' <summary>
        ''' 列別名
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>クエリ内で一意の文字列</remarks>
        Public ReadOnly Property ColumnAliasName As String
            Get
                Return If(Me.BaseColumnAlias IsNot Nothing, Me.BaseColumnAlias.ColumnAliasName, String.Format(COLUMN_ALIAS_FORMAT, Me.TableAlias.TableAliasName, Me.Index))
            End Get
        End Property

        ''' <summary>
        ''' 列属性
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>別名に紐づく列属性</remarks>
        Public Property Column As ColumnAttribute

        ''' <summary>
        ''' 関連元列別名
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property BaseColumnAlias As ColumnAlias

        ''' <summary>
        ''' 選択可能かどうかを示します
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>
        ''' リレーションの条件になっている場合、リレーション元と同一値になることが確実なので、
        ''' SELECT句に含めないようにしています
        ''' Column属性のIsLoadbleプロパティと相関はありませんので注意
        ''' </remarks>
        Public ReadOnly Property IsSelectable As Boolean
            Get
                '関連元列別名がある場合、オリジナルの情報ではありません
                Return If(Me.BaseColumnAlias Is Nothing, True, False)
            End Get
        End Property

        ''' <summary>
        ''' 列正式名
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>
        ''' TableAliasFullName.ColumnName
        ''' </remarks>
        Public ReadOnly Property FullName As String
            Get
                Return String.Format("{0}.{1}", Me.TableAlias.TableAliasFullName, Me.Column.ColumnName)
            End Get
        End Property

        ''' <summary>
        ''' SELECT句テキスト
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>
        ''' TableAliasFullName.ColumnName AS ColumnAliasName
        ''' </remarks>
        Public ReadOnly Property SelectCommandText As String
            Get
                Return String.Format("{0} AS {1}", Me.FullName, Me.ColumnAliasName)
            End Get
        End Property

    End Class

End Namespace